package com.learn.rabbit.base.config;

import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.HeadersExchange;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 交换机的配置
 *
 * @author zhousiqi
 * @version 1.0.0
 * @date 2019/2/26 17:49
 */
@Configuration
public class ExchangeConfig {

    /**
     * direct消息交换机的名字
     */
    public static final String EXCHANGE_DIRECT = "exchange_direct";

    /**
     * fanout消息交换机的名字
     */
    public static final String EXCHANGE_FANOUT = "exchange_fanout";

    /**
     * topic消息交换机的名字
     */
    public static final String EXCHANGE_TOPIC = "exchange_topic";

    /**
     * headers消息交换机的名字
     */
    public static final String EXCHANGE_HEADERS = "exchange_headers";

    /**
     * direct
     * 当routing key和消息队列的BindingKey一致的时候,消息将会被发送到该消息队列中（严格意义上的匹配）
     * <p>
     * 1.定义direct exchange，绑定exchange_direct
     * 2.durable="true" rabbitmq重启的时候不需要创建新的交换机
     * 3.direct交换器相对来说比较简单，匹配规则为：如果路由键匹配，消息就被投送到相关的队列
     * fanout交换器中没有路由键的概念，他会把消息发送到所有绑定在此交换器上面的队列中。
     * topic交换器你采用模糊匹配路由键的原则进行转发消息到队列中
     * key: queue在该direct-exchange中的key值，当消息发送给direct-exchange中指定key为设置值时，
     * 消息将会转发给queue参数指定的消息队列
     */
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(EXCHANGE_DIRECT, true, false);
    }

    /**
     * topic
     * 当routing key和消息队列的BindingKey匹配的时候,消息将会被发送到该消息队列中（通配符的匹配）
     * BindingKey 这里描述规则
     */
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange(EXCHANGE_TOPIC, true, false);
    }

    /**
     * fanout
     * 路由广播的形式,将会把消息发给绑定它的全部队列
     */
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange(EXCHANGE_FANOUT, true, false);
    }

    /**
     * header
     */
    @Bean
    public HeadersExchange headersExchange() {
        return new HeadersExchange(EXCHANGE_HEADERS, true, false);
    }
}
